import java.lang.String
import java.util.*
import kotlin.arrayOf

class StringDemo {
    companion object {

        // 字符串连接
        fun stringJoin() {
            println("StringDemo stringJoin")

            val part1 = "七律·长征"
            val part2 = "毛泽东"
            val part3 = "1935年10月"
            val part4 = "红军不怕远征难，万水千山只等闲。"
            val part5 = "五岭逶迤腾细浪，乌蒙磅礴走泥丸。"
            val part6 = "金沙水拍云崖暖，大渡桥横铁索寒。"
            val part7 = "更喜岷山千里雪，三军过后尽开颜。"

            // 使用字符串模版
            val all = "$part1\n$part2\n$part3$part4\n$part5\n$part6\n$part7\n"
            println(all)

            // 使用 + 操作符
            val all2 = part1+"\n"+part2+"\n"+part3+"\n"+part4+"\n"+part5+"\n"+part6+"\n"+part7+"\n"+2
            println(all2)

            // 多行字符串
            // 在原生字符串中表示字面值 $ 字符 --> ${'$'}
            val text = """
                        |多行字符串0
                        |多行字符串1
                        |多行字符串2
                        |${'$'}
                        |$part1
                        |${part2}
                        |end"""
            println(text)
            println(text.trimMargin())
        }

        // 字符串数组连接(components) 返回字符串
        fun array2String() {
            println("StringDemo array2String")

            val month = arrayOf(
                "January",
                "February",
                "March",
                "April",
                "May",
                "June",
                "July",
                "August",
                "September",
                "October",
                "November",
                "December",
            )
            println("array2String, using String.join: " + String.join("--", *month))

            val monthArr = Arrays.asList(*month)
            println("List2String, using String.join: " + String.join("--", monthArr))
        }


        // 左trim
        protected fun leftTrim(ostr: kotlin.String): kotlin.String {
            // 使用正则替换
            val trimmed = ostr.replace("^\\s+".toRegex(), "")
            return trimmed
        }

        // 右trim
        protected fun rightTrim(ostr: kotlin.String): kotlin.String {
            // 使用正则替换
            val trimmed = ostr.replace("\\s+$".toRegex(), "")
            return trimmed
        }

        // 前后空白字符剪切
        protected fun trimDemo() {
            println("StringDemo trimDemo")

            val ostr = " \t 2sapce+1tab 山外青山楼外楼 3space   "
            // 原生的两端trim
            val trimstr = ostr.trim()
            val regTrim = leftTrim(rightTrim(ostr))
            val leftTrimstr = leftTrim(ostr)
            val rightTrimstr = rightTrim(ostr)

            println("ostr        :|$ostr|")
            println("leftTrimstr :|$leftTrimstr|\t <-- 使用正则替换左起的空白字符")
            println("rightTrimstr:|$rightTrimstr|\t <-- 使用正则替换右起的空白字符")
            println("regTrim     :|$regTrim|\t\t <-- 使用正则替换左起和右起的空白字符")
            println("trimstr     :|$trimstr|\t\t <-- 使用String类 原生的 trim api")
        }

        // 字符串格式化
        protected fun formatDemo() {

            println("StringDemo formatDemo")

            // https://www.cnblogs.com/satire/p/16426550.html
            // https://www.cnblogs.com/HOI-Yzy/p/14671806.html

            /*

转换符	说  明	                            示  例
%b、%B	格式化为布尔类型	                    false
%h、%H	格式化为散列码	                        A05A5198
%s、%S	格式化为字符串类型	                    "abc"
%c、%C	格式化为字符类型	                    'w'
%d	    格式化为十进制数	                    26
%0	    格式化为八进制整数	                    12
%x、%X	格式化为十六进制整数	                4b 1
%e	    格式化为用计算机科学计数法表示的十进制数	1.700000e+01
%a	    格式化为带有效位数和指数的十六进制浮点值	0X1.C000000000001P4
%n	    结果为特定于平台的行分隔符
%%	    结果为字面值％，	                    %

搭配转换符的标志
标    志 说    明           示    例          结    果

+        为正数或者负数添加符号        ("%+d",15)               +15
−        左对齐                     ("%-5d",15)              |15   |
0        数字前面补0                 ("%04d", 99)             0099
空格      在整数之前添加指定数量的空格   ("% 4d", 99)             |  99|
,        以“,”对数字分组              ("%,f", 9999.99)        9,999.990000
(        使用括号包含负数             ("%(f", -99.99)          (99.990000)
<       格式化前一个转换符所描述的参数   ("%f和%<3.2f", 99.45)    99.450000和99.45
$       被格式化的参数索引             ("%1𝑑,s", 99,"abc")      99,abc
#       如果是浮点数则包含小数点，如果是16进制或8进制则添加0x或0 ("%#x", 99) ("%#o", 99) 0x63    0143
        */

            var str = kotlin.String.format("Hi,%s", "王力")
            println(str)
            str = kotlin.String.format("Hi,%s:%s.%s", "王南", "王力", "王张")
            println(str)

            System.out.printf("字母a的大写是：%c %n", 'A')
            System.out.printf("3>7的结果是：%b %n", 3 > 7)
            System.out.printf("100的一半是：%d %n", 100 / 2)
            System.out.printf("100的16进制数是：%x %n", 100)
            System.out.printf("100的8进制数是：%o %n", 100)
            System.out.printf("50元的书打8.5折扣是：%f 元%n", 50 * 0.85)
            System.out.printf("上面价格的16进制数是：%a %n", 50 * 0.85)
            System.out.printf("上面价格的指数表示：%e %n", 50 * 0.85)
            System.out.printf("上面价格的指数和浮点数结果的长度较短的是：%g %n", 50 * 0.85)
            System.out.printf("上面的折扣是%d%% %n", 85)
            System.out.printf("字母A的散列码是：%h %n", 'A')

            //$使用
            str = kotlin.String.format("格式参数\$的使用：%2\$s,%1\$d", 99, "abc")
            println(str)
            //+使用
            System.out.printf("显示正负数的符号：%+d与%d%n", 99, -99)
            //补O使用
            System.out.printf("最牛的编号是：%03d%n", 7)
            //空格使用
            System.out.printf("Tab键的效果是：% 8d%n", 7)
            //,使用
            System.out.printf("整数分组的效果是：%,d%n", 9989997)
            //空格和小数点后面个数
            System.out.printf("一本书的价格是：% 15.5f元%n", 49.8)
        }


        @JvmStatic  // 如果需要，可以通过@JvmStatic注解使得该静态方法在Java中也是可见的
        fun demoLogic() {
            println("StringDemo begin")

            // 字符串连接
            stringJoin()

            // 字符串数组连接(components) 返回字符串
            array2String()

            // 前后空白字符剪切
            trimDemo()

            // 字符串格式化
            formatDemo()
        }
    }
}